package fr.demos.cinepantin.controleur;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import fr.demos.cinepantin.Article;
import fr.demos.cinepantin.dao.DaoArticle;
import fr.demos.cinepantin.dao.impl.UploadImage;
import fr.demos.cinepantin.dao.interfac.ArticleDao;
import fr.demos.cinepantin.dao.interfac.UploadInterface;
import fr.demos.cinepantin.enumerate.Anciennete;
import fr.demos.cinepantin.enumerate.Categorie;
import fr.demos.cinepantin.enumerate.Tva;
import fr.demos.cinepantin.exception.DaoExceptions;
import fr.demos.cinepantin.exception.UploadImageExceptions;
import fr.demos.cinepantin.exception.UploadImageMauvaisFormatExceptions;
import fr.demos.cinepantin.util.Configuration;

/**
 * @author CQP-DNT
 * Servlet implementation class SaisirArticle
 */
@WebServlet("/SaisirArticle")
public class SaisirArticle extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Inject
	@DaoArticle
	private ArticleDao articledao;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public SaisirArticle() {
		super();
		
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd;
		request.setAttribute("page", "/saisirArticle.jsp");

		/**
		 * Action Afficher les details d'un article en recuperant les images 
		 */

		String action = (String) request.getParameter("action");
		Integer idArticle = null;
		Article article = null;

		try {
			// si l'action de modifier un article
			if (action != null && action.equals("modification")) {
				idArticle = Integer.parseInt(request.getParameter("id"));
				// recupere l'article par son id
				article = articledao.getArticleParId(idArticle);
				// on met en parametre les valeurs de d'article
				request.setAttribute("idArticle", article.getId());
				request.setAttribute("titre", article.getTitre());
				request.setAttribute("resume", article.getResume());
				request.setAttribute("anciennete", article.getAnciennete());
				request.setAttribute("anneeDeSortie",article.getAnneeDeSortie());
				request.setAttribute("tva", article.getTva());
				request.setAttribute("categorie", article.getCategorie());
				request.setAttribute("prixVente", article.getPrixVente());
				request.setAttribute("stock", article.getStock());

			}
		} catch (DaoExceptions e) {
			request.setAttribute("erreurPage",
					"Impossible de récupérer l'article. Veuillez recommencer plus tard");
		}
		rd = request.getRequestDispatcher("/page.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// action pour uploader une image

		String action = request.getParameter("action");

		if (action != null && action.equals("uploadImage")) {
			UploadInterface uploadImage = new UploadImage();
			List<String> listFilesNames;
			try {
				listFilesNames = uploadImage.UploadFile(request);

				for (String fileName : listFilesNames) {
					System.out.println(Configuration
							.getAbsolutePathDossierUploadImage(request)
							+ fileName);
					request.setAttribute("srcImage",
							Configuration.SERVLET_AFFICHER_IMAGE + "?src="
									+ fileName);
				}
			} catch (UploadImageMauvaisFormatExceptions e) {
				System.out.println("problème upload image");
				request.setAttribute("erreurImage",
						"le format de l'image n'est pas reconnu");

			} catch (UploadImageExceptions e) {
				request.setAttribute("erreurImage",
						"Un problème est survenu durant l'upload de l'images");
				// Impossible d'enregistrer l'image
				e.printStackTrace();
			}
			request.setAttribute("page", "/saisirArticle.jsp");
			RequestDispatcher rd = request.getRequestDispatcher("/page.jsp");
			rd.forward(request, response);
		}

		/**
		 *  Saisir Articles
		 */
		Integer idArticle = null;
		String titre = null;
		String resume = null;
		int anneeDeSortie = 0;
		double prixVente = 0;
		int stock = 0;
		String articleAjouter = titre;

		// creer la liste des erreurs
		ArrayList<String> erreurs = new ArrayList<>();
		RequestDispatcher rd = null;
		
		try {
			idArticle = Integer.parseInt(request.getParameter("id"));
		} catch (NumberFormatException e) {
			idArticle = null;
		}

		titre = (String) request.getParameter("titre");
		if (titre == null || titre.equals("")) {
			erreurs.add("Nom du titre requis");
		}

		if (titre != null && titre.length() > 30) {
			erreurs.add("Le titre depasse la taille du champs");
		}

		resume = (String) request.getParameter("resume");
		Anciennete anciennete = Anciennete.valueOf(request.getParameter("anciennete"));
		
		try {
			anneeDeSortie = Integer.parseInt(request.getParameter("anneeDeSortie"));
		} catch (NumberFormatException e) {
			erreurs.add("année de sortie invalide !");
		}
		
		Tva tva = Tva.valueOf(request.getParameter("tva"));
		Categorie categorie = Categorie.valueOf(request.getParameter("categorie"));

		try {
			prixVente = Double.parseDouble(request.getParameter("prixVente"));
		} catch (NumberFormatException e) {
			erreurs.add("Vous devez entrer le prix de vente");
		}

		try {
			stock = Integer.parseInt(request.getParameter("stock"));
		} catch (NumberFormatException e) {
			erreurs.add("stock invalide !");
		}

		if (erreurs.size() > 0) {
			request.setAttribute("erreurs", erreurs);
			request.setAttribute("idArticle", idArticle);
            request.setAttribute("titre", titre);
			request.setAttribute("resume", resume);
			request.setAttribute("anciennete", anciennete);
			request.setAttribute("anneeDeSortie", anneeDeSortie);
			request.setAttribute("tva", tva);
			// request.setAttribute("categorie", categorie);
			request.setAttribute("prixVente", prixVente);
			request.setAttribute("stock", stock);

			request.setAttribute("Création non effectuée dans la base ",
					erreurs);
			request.setAttribute("page", "/saisirArticle.jsp");
		} else {
          if(idArticle == null){
			Article arti ;
			arti = new Article(titre, resume, anciennete, anneeDeSortie,
					tva, categorie, prixVente, stock);

			try {
				articledao.addArticle(arti); // enregistrer la valeurs d'un
												// article saisie
				request.setAttribute("articleAjouter",articleAjouter);
				request.getRequestDispatcher("/AfficherArticle").forward(
						request, response);
			} catch (DaoExceptions e) {
				e.printStackTrace();
				erreurs.add("erreur ajout article dans la base !");
				request.setAttribute("page", "/saisirArticle.jsp");
			}
          } else {
        	  Article article = new Article(titre, resume, anciennete, anneeDeSortie, tva,categorie, prixVente, stock);
          try{
        	  articledao.modifierArticle(article);
        	  request.setAttribute("page", "/AfficherArticle");
          } catch (DaoExceptions e) {
				e.printStackTrace();
				erreurs.add("Modification Article Impossible");
				request.setAttribute("page", "/saisirArticle.jsp");
			}
          }

			rd = request.getRequestDispatcher("/page.jsp");
			rd.forward(request, response);

		}
		rd = request.getRequestDispatcher("/page.jsp");
		rd.forward(request, response);
	}
}
